package com.agritech.smartfarming.service;

import com.agritech.smartfarming.model.User;
import com.agritech.smartfarming.model.UserRole;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * 用户服务类，实现单例模式，负责用户管理
 */
public class UserService {
    private static UserService instance;
    private final Map<String, User> userMap; // 用户ID -> 用户对象
    private User currentUser; // 当前登录用户
    
    private UserService() {
        userMap = new HashMap<>();
        // 初始化默认用户
        initDefaultUsers();
    }
    
    /**
     * 获取UserService单例实例
     */
    public static synchronized UserService getInstance() {
        if (instance == null) {
            instance = new UserService();
        }
        return instance;
    }
    
    /**
     * 初始化默认用户
     */
    private void initDefaultUsers() {
        // 添加管理员用户
        User admin = new User("admin001", "admin", "admin123", UserRole.ADMIN);
        admin.setEmail("admin@agritech.com");
        admin.setPhone("13800000000");
        userMap.put(admin.getUserId(), admin);
        
        // 添加操作员用户
        User operator = new User("op001", "operator", "op123", UserRole.OPERATOR);
        operator.setEmail("operator@agritech.com");
        operator.setPhone("13900000000");
        userMap.put(operator.getUserId(), operator);
        
        // 添加监控员用户
        User monitor = new User("mon001", "monitor", "mon123", UserRole.MONITOR);
        monitor.setEmail("monitor@agritech.com");
        monitor.setPhone("13700000000");
        userMap.put(monitor.getUserId(), monitor);
        
        // 添加访客用户
        User guest = new User("guest001", "guest", "guest123", UserRole.GUEST);
        guest.setEmail("guest@agritech.com");
        guest.setPhone("13600000000");
        userMap.put(guest.getUserId(), guest);
    }
    
    /**
     * 用户登录
     * @param username 用户名
     * @param password 密码
     * @return 登录是否成功
     */
    public boolean login(String username, String password) {
        for (User user : userMap.values()) {
            if (user.getUsername().equals(username) && user.getPassword().equals(password) && user.isActive()) {
                currentUser = user;
                System.out.println("用户 " + username + " 登录成功，角色: " + user.getRole());
                return true;
            }
        }
        System.out.println("登录失败: 用户名或密码错误");
        return false;
    }
    
    /**
     * 用户登出
     */
    public void logout() {
        if (currentUser != null) {
            System.out.println("用户 " + currentUser.getUsername() + " 已登出");
            currentUser = null;
        }
    }
    
    /**
     * 添加新用户（需要管理员权限）
     */
    public boolean addUser(User user) {
        if (currentUser == null || !currentUser.hasPermission(UserRole.ADMIN.getPermissionLevel())) {
            System.out.println("权限不足: 只有管理员可以添加用户");
            return false;
        }
        
        if (userMap.containsKey(user.getUserId())) {
            System.out.println("添加用户失败: 用户ID已存在");
            return false;
        }
        
        userMap.put(user.getUserId(), user);
        System.out.println("成功添加用户: " + user.getUsername() + " (ID: " + user.getUserId() + ")");
        return true;
    }
    
    /**
     * 删除用户（需要管理员权限）
     */
    public boolean deleteUser(String userId) {
        if (currentUser == null || !currentUser.hasPermission(UserRole.ADMIN.getPermissionLevel())) {
            System.out.println("权限不足: 只有管理员可以删除用户");
            return false;
        }
        
        if (!userMap.containsKey(userId)) {
            System.out.println("删除用户失败: 用户ID不存在");
            return false;
        }
        
        User removedUser = userMap.remove(userId);
        System.out.println("成功删除用户: " + removedUser.getUsername() + " (ID: " + removedUser.getUserId() + ")");
        return true;
    }
    
    /**
     * 更新用户信息
     */
    public boolean updateUser(User user) {
        if (currentUser == null) {
            System.out.println("操作失败: 未登录");
            return false;
        }
        
        // 只有管理员可以更新其他用户信息，普通用户只能更新自己的信息
        if (!currentUser.getUserId().equals(user.getUserId()) && 
            !currentUser.hasPermission(UserRole.ADMIN.getPermissionLevel())) {
            System.out.println("权限不足: 只有管理员可以更新其他用户信息");
            return false;
        }
        
        if (!userMap.containsKey(user.getUserId())) {
            System.out.println("更新用户失败: 用户ID不存在");
            return false;
        }
        
        userMap.put(user.getUserId(), user);
        System.out.println("成功更新用户: " + user.getUsername() + " (ID: " + user.getUserId() + ")");
        return true;
    }
    
    /**
     * 获取所有用户列表
     */
    public List<User> getAllUsers() {
        return new ArrayList<>(userMap.values());
    }
    
    /**
     * 根据ID获取用户
     */
    public User getUserById(String userId) {
        return userMap.get(userId);
    }
    
    /**
     * 获取当前登录用户
     */
    public User getCurrentUser() {
        return currentUser;
    }
    
    /**
     * 检查当前用户是否有权执行特定操作
     */
    public boolean checkPermission(int requiredLevel) {
        return currentUser != null && currentUser.hasPermission(requiredLevel);
    }
} 